package com.smart4j.chapter.common.util;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.NoSuchElementException;
import java.util.Properties;

import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;




/**
 * description: 读取  .properties 配置文件工具类
 * @version v1.0
 * @author w
 * @date 2018年8月18日下午10:23:34
 *
 */

public final class PropertyUtils {

	private static Logger logger = LoggerFactory.getLogger(PropertyUtils.class);

	private PropertyUtils (){}
	
	
	private static  PropertyUtils instanse ; 
	
	private static final Properties prop = new Properties();
	
	public static synchronized PropertyUtils getInstanse(){
		if(instanse == null){
			instanse = new PropertyUtils();
		}
		return instanse;
	}
	
	/**
	 * description: 根据文件路径加载配置文件
	 * @param path
	 * void 
	 * @version v1.0
	 * @author w
	 * @date 2018年8月22日 下午4:08:38
	 *
	 */
	public void load(String path){
		File file = new File(path);
		if(!file.exists()){
			logger.warn("file not found by the :"+ path);
			return;
		}
		FileReader reader = null ;
		try {
			reader = new FileReader(file);
			prop.load(reader);
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}finally {
			if(null != reader ){
				try {
					reader.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}
	
	/**
	 * description: 同时加载多个配置文件
	 * @param path
	 * void 
	 * @version v1.0
	 * @author w
	 * @date 2018年8月22日 下午4:08:54
	 */
	public void load(String ...path){
		if(path != null && path.length > 0){
			for (String src : path) {
				load(src);
			}
		}
	}
	
	/**
	 * description: 获取配置文件属性值 
	 * @param key
	 * @return
	 * String 
	 * @version v1.0
	 * @author w
	 * @date 2018年8月22日 下午4:33:33
	 *
	 */
	private String getValue(String key){
		if(StringUtils.isBlank(key)){
			return null ;
		}
		if(prop.containsKey(key)){
			return prop.getProperty(key);
		}
		return "";
	}
	
	/**
	 * description: 获取配置文件的属性值
	 * @param key
	 * @return
	 * String 
	 * @version v1.0
	 * @author w
	 * @date 2018年8月22日 下午4:39:44
	 */
	public String getProperty(String key){
		String value = getValue(key);
		if(null == value){
			throw new NoSuchElementException(key);
		}
		return value;
	}
	
	/**
	 * description:获取配置文件的属性值,若不存在，返回默认值 defaultValue
	 * @param key
	 * @param defaultValue
	 * @return
	 * String 
	 * @version v1.0
	 * @author w
	 * @date 2018年8月22日 下午4:44:11
	 */
	public String getProperty(String key,String defaultValue){
		String value = getValue(key);
		return value !=null?value:defaultValue;
	}
	
	public Integer getInteger(String key){
		String value = getValue(key);
		if(null == value){
			throw new NoSuchElementException(key);
		}
		return Integer.valueOf(value);
	}
	
	public Integer getInteger(String key,Integer defaultvalue  ){
		String value = getValue(key);
		return value != null ? Integer.valueOf(value) : defaultvalue;
	}
	
	public Double getDouble(String key){
		String value = getValue(key);
		if(null == value){
			throw new NoSuchElementException(key);
		}
		return Double.valueOf(value);
	}
	
	public Double getDouble(String key,Double defaultvalue  ){
		String value = getValue(key);
		return value != null ? Double.valueOf(value) : defaultvalue;
	}
	
	public Boolean getBoolean(String key){
		String value = getValue(key);
		if(null == value){
			throw new NoSuchElementException(key);
		}
		return Boolean.valueOf(value);
	}
	
	public Boolean getBoolean(String key,Boolean defaultvalue  ){
		String value = getValue(key);
		return value != null ? Boolean.valueOf(value) : defaultvalue;
	}
	
	public static void main(String[] args) {
		String path="src/main/resources/chapter.properties";
		String path2="src/main/resources/cha.properties";
		PropertyUtils.getInstanse().load(path,path2);
		logger.info("load file success !");
		System.out.println(prop.getProperty("dd"));
	}
}
